The forall() loop was buggy as it was skipping items in the list when
the current item gets removed from the groups array as a result of
calling the callback (causing memory leaks).
gpointer callback_data)
{
GtkToolPalette *palette = GTK_TOOL_PALETTE (container);
- guint i;
-
+ guint i, len;
for (i = 0; i < palette->priv->groups->len; ++i)
{
GtkToolItemGroupInfo *info = g_ptr_array_index (palette->priv->groups, i);
+
+ len = palette->priv->groups->len;
+
if (info->widget)
callback (GTK_WIDGET (info->widget),
callback_data);
+
+ /* At destroy time, 'callback' results in removing a widget,
+ * here we just reset the current index to account for the removed widget. */
+ i -= (len - palette->priv->groups->len);
}
}